day21 04 三级菜单

day21 04 三级菜单

 

1.使用递归调用的方法

整体代码类型比较简单如下:

menu={'北京':{'海淀':{'a':{},'h':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龙观':{}},'朝阳':{},'东城':{}}
    ,'上海':{'闵行':{'d':{},'f':{},'g':{}},'阐北':{},'浦东':{}}
    ,'山东':{}}
l=[menu]
def threeLM(dic):
    while True:
        for key in dic:print(key)
        key=input('input>>').strip()
        if key=='b' or key=='q':return key
        elif key in dic.keys() and dic[key]:
            ret=threeLM(dic[key])
            if ret=='q':return 'q'
threeLM(menu)

对每次用户输入与调用进行详细展开分析:

#第一次调用:dic=menu
def threeLM(dic):
    while True:#进来就是死循环
        for key in dic:print(key)  #1. 打印 北京 上海 山东
        key=input('input>>').strip() #2. 用户输入 北京 上海 山东 其中一个,假设输入北京
        #6.用户输入 打印 海淀 昌平 朝阳 东城 其中一个,假设输入昌平
        if key=='b' or key=='q':return key
        elif key in dic.keys() and dic[key]: #3. 输入的key在字典里面,且字典不为空
            ret=threeLM(dic[key]) #4. 再次调用函数,把输入的字典传进去,比如输入北京则将   #18  接收#17返回的q ret=q
            # {'海淀':{'a':{},'b':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龙观':{}},'朝阳':{},'东城':{}}
            # 这个字典传进去,再次循环
            if ret=='q':return 'q'  #19 return q 函数就结束了,所以用户输入q结果就是退出程序
threeLM(menu)

#第二次调用:dic={'海淀':{'a':{},'b':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龙观':{}},'朝阳':{},'东城':{}}
def threeLM(dic):
    while True:#进来就是死循环
        for key in dic:print(key)
        #5. 打印 海淀 昌平 朝阳 东城
        #13  elif语句结束后 又开始循环,打印 海淀 昌平 朝阳 东城,所以#10的地方输入b结果就是返回上一级菜单
        key=input('input>>').strip()
        #6. 用户输入 打印 海淀 昌平 朝阳 东城 其中一个,假设输入昌平
        if key=='b' or key=='q':return key
        elif key in dic.keys() and dic[key]: #7. 输入的key在字典里面,且字典不为空
            ret=threeLM(dic[key])#8. 再次调用函数,把输入的字典{'沙河':{},'天通苑':{},'回龙观':{}}传进去,再次循环
                                 #12  接收#11返回的值,ret=b 不符合下面的if条件,所以elif语句结束了
                                 #16  接收#15返回的值,ret=q 符合下面的if语句
            if ret=='q':return 'q'  #17   将q返回上个调用的地方,即#4的地方
threeLM(menu)

#第三次调用:dic={'沙河':{},'天通苑':{},'回龙观':{}}
def threeLM(dic):
    while True:#进来就是死循环
        for key in dic:print(key)
        #9. 打印 沙河 天通苑 回龙观
        key=input('input>>').strip() #10. 假设用户输入的是b  #14  假设用户在这里输入q
        if key=='b' or key=='q':return key #11. return b 给前面调用的地方即‘#8’的地方  #15 return q给前面调用的地方
        elif key in dic.keys() and dic[key]:
            ret=threeLM(dic[key])
            if ret=='q':return 'q'
threeLM(menu)

运行结果:

C:\Users\sku1-1\PycharmProjects\untitled\venv\Scripts\python.exe "C:/Users/sku1-1/PycharmProjects/untitled/day 21 04 三级菜单.py"
山东
北京
上海
input>>北京
昌平
海淀
东城
朝阳
input>>海淀
a
c
h
input>>b
昌平
海淀
东城
朝阳
input>>q

Process finished with exit code 0

 

其中比较绕的地方就是当用户输入b和q的时候了:

用户输入b----返回上一级菜单:利用给调用的地方(上一级菜单)返回一个值b,然后结束语句,就在上一级继续循环

用户输入q----退出程序:通过一层一层的返回q值,知道退出程序

 

2.使用堆栈的方法  

代码如下:

 

menu={'北京':{'海淀':{'a':{},'h':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龙观':{}},'朝阳':{},'东城':{}}
    ,'上海':{'闵行':{'d':{},'f':{},'g':{}},'阐北':{},'浦东':{}}
    ,'山东':{}}
l=[menu] #首先有一个栈
while True:
    for key in l[-1]:print(key)#l[-1]是最后一个值,从最后一个开始打印,先进后出 l[-1]=menu 打印北京 上海 山东
    k=input('input>>').strip() #用户输入北京
    if k in l[-1].keys() and l[-1][key]:#判断输入的在不再字典当中以及是不是为空,如果为真执行下面的代码
        l.append(l[-1][k]) #将北京的字典放入l中,此时l=[menu,{海淀。。。。}],再while True 循环,又取的最后一个
        #如果知道这里已经可以进去了,但是出不去
    elif k=='b':
        l.pop() #把这一级菜单删除,直接就返回上级菜单
    elif k=='q':break #用户输入q退出程序
    else:continue

运行结果:

C:\Users\sku1-1\PycharmProjects\untitled\venv\Scripts\python.exe C:/Users/sku1-1/PycharmProjects/untitled/三级菜单.py
山东
北京
上海
input>>北京
东城
昌平
朝阳
海淀
input>>昌平
沙河
天通苑
回龙观
input>>b
东城
昌平
朝阳
海淀
input>>q

Process finished with exit code 0

 返回上一级菜单所作的操作:把原来所在的本级菜单直接删除,就剩下上一级菜单了

 

 

 
posted @ 2019-05-07 22:05  且行且cherish  阅读(294)  评论(0编辑  收藏  举报